package cromosomas;

import util.Aleatorio;
import elementosEvolutivos.Cromosoma;

public class CromosomaEstrategia extends Cromosoma{
	
	public static enum Tipo { AVANZA,DERECHA,IZQUIERDA,SIC,PROGN2,PROGN3}; 
	private Arbol genotipo;
	private int profundidad;
	private boolean completo;
	
	public boolean isCompleto(){
		return completo;
	}
	
	public int getProfundidad(){
		return profundidad;
	}
	
	public CromosomaEstrategia(int prof, boolean compl){
		genotipo= new Arbol(null);
		profundidad=prof;
		completo=compl;
	}
	
	@Override
	public Cromosoma clone() {
		CromosomaEstrategia cr = new CromosomaEstrategia(profundidad,completo);
		cr.genotipo = this.genotipo.clone();
		cr.evaluacion = this.evaluacion;	
		cr.aptitud = this.aptitud;
		cr.puntuacion = this.puntuacion;
		cr.punt_acum = this.punt_acum;
		return cr;
	}

	@Override
	public void inicializar() {
		int prof_min = completo? profundidad : 0;
		genotipo = crearArbol(null, prof_min, profundidad, 0);
	}
	
	public void setArbol(Arbol ar){
		genotipo=ar;
	}
	
	public Arbol getArbol(){
		return genotipo;
	}
	
	public Arbol crearArbol(Arbol padre, int prof_min, int prof_max, int prof){
		Tipo t;
		if(prof_min > 0){
			t = nodoAleatorio(1);
		}
		else if(prof_max == 0){
			t = nodoAleatorio(2);
		}
		else{
			t = nodoAleatorio(0);
		}
		Arbol ar= new Arbol(padre);
		ar.setTipo(t);
		ar.setProfundidad(prof);
		switch(t){
		case SIC:
		case PROGN2:
			ar.setNumHijos(2);
			ar.getHijos()[0] = crearArbol(ar,prof_min-1,prof_max-1,prof+1);
			ar.getHijos()[1] = crearArbol(ar,prof_min-1,prof_max-1,prof+1);
			break;
		case PROGN3:
			ar.setNumHijos(3);
			ar.getHijos()[0] = crearArbol(ar,prof_min-1,prof_max-1,prof+1);
			ar.getHijos()[1] = crearArbol(ar,prof_min-1,prof_max-1,prof+1);
			ar.getHijos()[2] = crearArbol(ar,prof_min-1,prof_max-1,prof+1);
			break;
		}
		return ar;	
	}
	
	private Tipo nodoAleatorio(int tipo){
		/* tipo 0: operador o terminal
		 * tipo 1: operador
		 * tipo 2: terminal
		 */
		int pos=0;
		switch(tipo){
		case 0:
			pos = Aleatorio.getIntAleatorio(6);
			return Tipo.values()[pos];
		case 1:
			pos = Aleatorio.getIntAleatorio(3);
			return Tipo.values()[3+pos];
		case 2:
			pos = Aleatorio.getIntAleatorio(3);
			return Tipo.values()[pos];
		}
		return Tipo.values()[pos];
	}
	
	public String toString(){
		return genotipo.toString()+"\n";
	}
	
	public static void main(String[]args){
		CromosomaEstrategia c = new CromosomaEstrategia(2,false);
		c.inicializar();
		System.out.print(c);
	}

}
